package com.youliao.java;

import org.junit.Test;

/**
 * @Author Dali
 * @Date 2021/5/1 11:04
 * @Version 1.0
 * @Description
 */
public class StringTest {

    /**
     * String:字符串，使用一对”"引起来表示。
     * 1. String声明为final的，不可被继承
     * 2. String实现了Serializable接口:表示字符串是支持序列化的。
     * 实现了Comparable接口:表示String 可以比较大小
     * 3. String内部定义了final char[] value用于存储字符串数据
     * 4. String:代表不可变的字符序列。简称:不可变性。
     * 体现:
     */
    @Test
    public void test1() {
        String str1 = "abc";    //字面量的定义方式
        String str2 = "abc";    //字面量的定义方式
//        str1="hello";
        System.out.println(str1 == str2);   //true 两个对象用"=="比较的是str1和str2的地址值
        System.out.println("str1:" + str1);   //hello
        System.out.println("str2:" + str2);   //youliao

        System.out.println("********************************");
        String str3 = "abc";
        System.out.println(str2 == str3);
        str3 += "def";
        System.out.println(str3);       //abcdef
    }

    @Test
    public void test2() {
        /**
         * 结论:
         * 1、常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
         * 2、只要其中有一个是变量，结果就在堆中
         * 如果拼接的结果调用intern()方法，返回值就在常量池中
         */
        String s1 = "javaEE";
        String s2 = "hadoop";

        String s3 = "javaEEhadoop";
        String s4 = "javaEE" + "hadoop";
        String s5 = s1 + "hadoop";      //此处的s1相当于new 以下同理
        String s6 = "javaEE" + s2;
        String s7 = s1 + s2;
        System.out.println(s3 == s4);       //true
        System.out.println("s3:" + s3 + "\t" + "s4：" + s4);
        System.out.println(s3 == s5);       //false
        System.out.println("s3:" + s3 + "\t" + "s5：" + s5);
        System.out.println(s3 == s6);       //false
        System.out.println("s3:" + s3 + "\t" +"s6：" + s6);
        System.out.println(s3 == s7);       //false
        System.out.println("s3:" + s3 + "\t" + "s7：" + s7);

        System.out.println(s5 == s6);       //false
        System.out.println("s5:" + s5 + "\t" + "s6：" + s6);
        System.out.println(s5 == s7);       //false
        System.out.println("s5:" + s5 + "\t" + "s7：" + s7);
        System.out.println(s6 == s7);       //false
        System.out.println("s6:" + s6 + "\t" + "s7：" + s7);

        String s8 = s5.intern();
        System.out.println(s3 == s8);//true

    }
}
